Loading Libraries

# load libraries

library(quanteda)
library(readtext)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(wordcloud)
Lade nötiges Paket: RColorBrewer
library(RColorBrewer)
library(wordcloud2)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.2     ✓ dplyr   1.0.7
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   2.0.0     ✓ forcats 0.5.1
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(tm)
Lade nötiges Paket: NLP

Attache Paket: ‘NLP’

Das folgende Objekt ist maskiert ‘package:ggplot2’:

    annotate

Die folgenden Objekte sind maskiert von ‘package:quanteda’:

    meta, meta<-


Attache Paket: ‘tm’

Das folgende Objekt ist maskiert ‘package:quanteda’:

    stopwords
library("textcat")
library("quanteda.textplots")
library("quanteda.textstats")
library("gsubfn")
Lade nötiges Paket: proto
Warnung in doTryCatch(return(expr), name, parentenv, handler)
  kann shared object '/Library/Frameworks/R.framework/Resources/modules//R_X11.so' nicht laden:
  dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/4.1/Resources/modules/R_X11.so
  Reason: image not found
Could not load tcltk.  Will use slower R code instead.
library("spacyr")

spacy_initialize(model = "de_core_news_sm")
Found 'spacy_condaenv'. spacyr will use this environment
successfully initialized (spaCy Version: 3.1.1, language model: de_core_news_sm)
(python options: type = "condaenv", value = "spacy_condaenv")

Start here to load existing corpora:

# load corpus files 
full_corpus = readRDS("corpora/full_corpus.rds")
full_corpus_sents = readRDS("corpora/full_corpus_sents.rds")

pro_corpus = readRDS("corpora/pro_corpus.rds")
contra_corpus = readRDS("corpora/contra_corpus.rds")

pro2000 = readRDS("corpora/pro2000.rds")
pro900 = readRDS("corpora/pro900.rds")
contra2000 = readRDS("corpora/contra2000.rds")
contra900 = readRDS("corpora/contra900.rds")

fff_de_corpus = readRDS("corpora/fff_de_corpus.rds")
ikem_corpus = readRDS("corpora/ikem_corpus.rds")
klimarep_corpus = readRDS("corpora/klimarep_corpus.rds")
klimafakten_corpus = readRDS("corpora/klimafakten_corpus.rds")
zero_corpus = readRDS("corpora/zero_corpus.rds")
komma_corpus = readRDS("corpora/komma_corpus.rds")
eike_corpus = readRDS("corpora/eike_corpus.rds")
ffh_corpus = readRDS("corpora/ffh_corpus.rds")

Exploring the corpus

summary(pro2000, n = 10)
Corpus consisting of 2000 documents, showing 10 documents:

             Text Types Tokens Sentences origin language     group id
     kr_00007.txt   196    284        19     kr   german activists  1
   ikem_01141.txt    27     30         2   ikem   german activists  2
 fff_de_00121.txt   105    178        11 fff_de   german activists  3
   ikem_00898.txt   210    869        32   ikem   german activists  4
   ikem_00709.txt    20     43         3   ikem   german activists  5
   ikem_00588.txt   209    573        11   ikem   german activists  6
     kr_00036.txt   415    695        30     kr   german activists  7
   ikem_00627.txt   353   1003        23   ikem   german activists  8
   ikem_00532.txt   277    530        29   ikem   german activists  9
   ikem_00518.txt   140    233         6   ikem   german activists 10
summary(contra2000, n=10)
Corpus consisting of 2000 documents, showing 10 documents:

           Text Types Tokens Sentences origin language    group id
 eike_05241.txt   484    943        36   eike   german sceptics  1
 eike_07670.txt    67     79         8   eike   german sceptics  2
 eike_12660.txt    24     30         2   eike   german sceptics  3
 eike_13073.txt    96    135         4   eike   german sceptics  4
 eike_09381.txt    22     27         2   eike   german sceptics  5
 eike_05930.txt   101    152         6   eike   german sceptics  6
 eike_02092.txt  1412   3659       173   eike   german sceptics  7
 eike_03703.txt  1645   4420       187   eike   german sceptics  8
 eike_12814.txt    21     26         2   eike   german sceptics  9
 eike_04522.txt  1050   2511       128   eike   german sceptics 10

Corpus statistics

# to get index number 
#id_pro = 1:ndoc(pro900)

Plotting Number of Sentences

contra2000_sum <- summary(contra2000)
pro2000_sum <- summary(pro2000)
pro900_sum <- summary(pro900, ndoc(pro900))
contra900_sum <- summary(contra900, ndoc(contra900))


#to get id as x axis
#id_pro[1:100]
#contra900_sum$id

ggplot(pro2000_sum, aes(id, Sentences, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Sentences Pro2000")


ggplot(contra2000_sum, aes(id, Sentences, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Sentences Contra2000")

pro900_sum <- summary(pro900, n=100)
contra900_sum <- summary(contra900, n=100)


ggplot(pro900_sum, aes(pro900_sum$id, Tokens, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Tokens Pro900")


ggplot(contra900_sum, aes(contra900_sum$id, Tokens, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Tokens Contra900")

ggplot(pro900_sum, aes(pro900_sum$id, Types, group=1)) + 
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Types Pro900")


ggplot(contra900_sum, aes(contra900_sum$id, Types, group=1)) +
  geom_line() + 
  geom_point() +
  theme(axis.text.x = element_text(angle=0, vjust=1, hjust=1)) + 
  ggtitle("Types Contra900")

NA
NA
ggplot(pro900_sum, aes(Tokens, Types, group=1, label= id)) +
  geom_smooth(method = "lm", formula ="y ~ x", se = FALSE) +
  geom_text(check_overlap = T) +
  ggtitle("Type-Token-Relation Pro900")


ggplot(contra900_sum, aes(Tokens, Types, group=1, label= id)) +
  geom_smooth(method = "lm", formula ="y ~ x", se = FALSE) +
  geom_text(check_overlap = T) +
  ggtitle("Type-Token-Relation Contra900")

<<<<<<< Updated upstream # Word Frequencies

1. Step: Create DFM, Load Stoplists

# stoplists
de_stopwords <- stopwords::stopwords("de", source="snowball")
en_stopwords <- stopwords::stopwords("en", source="snowball" )
custom_stopwords <- read.table("de_complete.txt", header=F, sep="\n")



# add own stopwords 
full_stopwords <- c(de_stopwords, "dass", "=", "the", "seit", "ab", "beim", "\n", "mal", "c", "|", "m", "kommentare", "neueste", "gepostet", custom_stopwords, en_stopwords)
de_stopwords1 <- c(de_stopwords, "dass", "=", "the", "seit", "ab", "beim", "\n", "mal", "c", "\\|","|", "m", "kommentare", "neueste", "gepostet", "admin", "cookies", "inhalte", "inhalt", "newsletter", "posten", "zugriff", "passwort", "geschützt", "seite", "website", "webseite", "and", "0", "1", "2", "3","4","5","6","7","8","9", "mfg","w","t","wer")

# create dfm
dfm_p2000 <- dfm(pro2000, remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
dfm_c2000 <- dfm(contra2000, remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead

Corpus Cleaning: Lemmatization -> new lemmatized dfm

# pro 
sp_pro2000 <- spacy_parse(pro2000, pos=FALSE, entity=FALSE, dependency=FALSE)
Warnung in spacy_parse.character(pro2000, pos = FALSE, entity = FALSE, dependency = FALSE)
  lemmatization may not work properly in model 'de_core_news_sm'
sp_pro2000$token <- sp_pro2000$lemma

sp_dfm_p2000 <- as.tokens(sp_pro2000)%>%
  dfm(remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE, tolower=TRUE)
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
# contra
sp_contra2000 <- spacy_parse(contra2000, pos=FALSE, entity=FALSE, dependency=FALSE)
Warnung in spacy_parse.character(contra2000, pos = FALSE, entity = FALSE, 
  lemmatization may not work properly in model 'de_core_news_sm'
sp_contra2000$token <- sp_contra2000$lemma

sp_dfm_c2000 <- as.tokens(sp_contra2000)%>%
  dfm(remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE, tolower=TRUE)
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
sp_full <- spacy_parse(full_corpus, pos=FALSE, entity=FALSE, dependency=FALSE)
Warnung in spacy_parse.character(full_corpus, pos = FALSE, entity = FALSE, 
  lemmatization may not work properly in model 'de_core_news_sm'
sp_full$token <- sp_full$lemma

sp_dfm_full <- as.tokens(sp_full) %>%
  dfm(remove=full_stopwords, remove_punct=TRUE, remove_numbers=TRUE, tolower=TRUE)
Warnung: '...' should not be used for tokens() arguments; use 'tokens()' first.
Warnung: 'remove' is deprecated; use dfm_remove() instead
dfm_p2000
Document-feature matrix of: 2,000 documents, 60,243 features (99.72% sparse) and 4 docvars.
                  features
docs               klima update ° folge extremwetter eu-klimaplan versicherungswende wütet weltweit eu-kommission
  kr_00007.txt         3      3 3     1            3            1                  1     2        2             1
  ikem_01141.txt       0      0 0     0            0            0                  0     0        0             0
  fff_de_00121.txt     0      0 0     0            0            0                  0     0        0             0
  ikem_00898.txt       0      0 0     0            0            0                  0     0        0             0
  ikem_00709.txt       0      0 0     0            0            0                  0     0        0             0
  ikem_00588.txt       0      0 0     0            0            0                  0     0        0             0
[ reached max_ndoc ... 1,994 more documents, reached max_nfeat ... 60,233 more features ]
dfm_c2000
Document-feature matrix of: 2,000 documents, 150,974 features (99.71% sparse) and 4 docvars.
                features
docs             interne ermittler schule glauben ehemalige labortechnikerin erin potts-kant daten medizinische
  eike_05241.txt       1         1      2       1         2                1    1          6     7            1
  eike_07670.txt       0         0      0       0         0                0    0          0     0            0
  eike_12660.txt       0         0      0       0         0                0    0          0     0            0
  eike_13073.txt       0         0      0       0         0                0    0          0     0            0
  eike_09381.txt       0         0      0       0         0                0    0          0     0            0
  eike_05930.txt       0         0      0       0         0                0    0          0     0            0
[ reached max_ndoc ... 1,994 more documents, reached max_nfeat ... 150,964 more features ]

2. Step: Check Topfeatures of DFM -> most frequently occuring terms

topfeatures(sp_dfm_p2000, n=50)
        mehr          uhr         ikem       mensch         jahr         weit  deutschland        geben      energie 
        4283         3497         2657         2464         2062         1698         1645         1602         1592 
       thema      aktuell       sollen         groß        gehen  klimaschutz          gut        sowie        immer 
        1402         1362         1323         1319         1301         1289         1276         1207         1156 
     bleiben  information       müssen        schon        dabei       future       arbeit       stehen energiewende 
        1152         1151         1144         1084         1020          992          977          926          901 
     politik       finden        welch         land      projekt         ziel      wichtig       berlin       kommen 
         895          891          886          876          869          863          851          846          838 
     fridays     erfahren          jed      zukunft   klimakrise   newsletter         ganz          neu       rahmen 
         831          825          816          813          796          780          769          750          748 
    laufende      möglich         erst     anmelden        frage 
         741          735          721          720          717 
topfeatures(sp_dfm_c2000, n=50)
       jahr       geben        mehr       schon       immer         co2         gut      kommen          ja       gehen 
       9197        6646        6328        4722        4289        4114        4067        4056        3951        3821 
       weit deutschland      sollen      mensch       sagen        groß       welch         jed      zeigen     energie 
       3786        3643        3640        3559        3448        3378        3332        3286        3102        2921 
       hoch       wenig        ganz      global       sehen      müssen  temperatur       strom        herr   natürlich 
       2883        2869        2834        2523        2503        2480        2423        2399        2381        2236 
     stehen     einfach           °        zeit       klima        erst      finden       heute       frage        land 
       2234        2226        2221        2215        2196        2154        2121        2064        2048        2001 
klimawandel      liegen        etwa   erwärmung       genau      wissen        erde        welt  atmosphäre         tun 
       1944        1912        1901        1856        1852        1852        1824        1822        1808        1804 
tf_p2000 <- topfeatures(sp_dfm_p2000, n=50)
tf_c2000 <- topfeatures(sp_dfm_c2000, n=50)
textstat_frequency(sp_dfm_p2000, n=50)

Plotting word frequencies

klima_p2000 <- dfm_select(sp_dfm_p2000, pattern="klima*")
klima_c2000 <- dfm_select(sp_dfm_c2000, pattern="klima*")
klima_terms_p2000 <- topfeatures(klima_p2000, n=100)
klima_terms_c2000 <- topfeatures(klima_c2000, n=100)
freq_p2000 <- textstat_frequency(sp_dfm_p2000, n=50)
freq_c2000 <- textstat_frequency(sp_dfm_c2000, n=50)

plot_p2000 <- with(freq_p2000, reorder(feature, -frequency))
plot_c2000 <- with(freq_c2000, reorder(feature, -frequency))

#create plot for eike klima words frequencies
plot1 <- ggplot(freq_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot1


#create plot for klimareporter klima words frequencies
plot2 <- ggplot(freq_c2000, aes(x=feature, y=frequency)) + 
  geom_point()+ ggtitle("C2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1)) 
  
#ggsave(plot=plot2, width = 10, height = 5, dpi=300, filename="klima_klimarep_plot.jpeg" )
plot2

Same Plot for “Klima” Words

freq_klima_p2000 <- textstat_frequency(klima_p2000, n=50)
freq_klima_c2000 <- textstat_frequency(klima_c2000, n=50)

freq_klima_p2000$feature <- with(freq_klima_p2000, reorder(feature, -frequency))
freq_klima_c2000$feature <- with(freq_klima_c2000, reorder(feature, -frequency))

#create plot for eike klima words frequencies
plot1 <- ggplot(freq_klima_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Klimawörter Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot1


#create plot for klimareporter klima words frequencies
plot2 <- ggplot(freq_klima_c2000, aes(x=feature, y=frequency)) + 
  geom_point()+ ggtitle("C2000 Klimawörter Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1)) 
  
#ggsave(plot=plot2, width = 10, height = 5, dpi=300, filename="klima_klimarep_plot.jpeg" )
plot2

# to save lists of klima-words 
# w/o "$feature" it saves the whole table as text file (with frequency info etc.)
#capture.output(list(freq_klima_p2000$feature), file = "terms_pro.txt")
#capture.output(list(freq_klima_c2000$feature), file = "terms_contra.txt")

Plot TF-IDF (not working yet!!!)

# weighted words
p2000_weight <- dfm_weight(sp_dfm_p2000, scheme="prop")
c2000_weight <- dfm_weight(sp_dfm_c2000, scheme="prop")

relfreq_p2000 <- textstat_frequency(p2000_weight, n=50)
relfreq_c2000 <- textstat_frequency(c2000_weight, n=50)

#tfidf
p2000_tfidf <- dfm_tfidf(sp_dfm_p2000, scheme_tf = "prop")
c2000_tfidf <- dfm_tfidf(sp_dfm_c2000, scheme_tf = "prop")

#plot3 <- with(relfreq_p2000, reorder(feature, -freqency))
relfreq_p2000$feature <- with(relfreq_p2000, reorder(feature, -frequency))
plot3 <- ggplot(relfreq_p2000, aes(x=feature, y=frequency)) + 
  geom_point()+ggtitle("P2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot3

pro_freq_tfidf <- p2000_tfidf %>%
  textstat_frequency(n=10, force=TRUE)

con_freq_tfidf <- c2000_tfidf %>%
  textstat_frequency(n=10, force=TRUE)

tplot_tfidf_p2000 <- ggplot(data=pro_freq_tfidf,
                      aes(x=factor(nrow(pro_freq_tfidf):1),
                          y=frequency)) +
  geom_point() +
  coord_flip() +
  scale_x_discrete(breaks=factor(nrow(pro_freq_tfidf):1),
                   labels=pro_freq_tfidf$feature) +
  labs(x=NULL, y="tf-idf")

tplot_tfidf_p2000


tplot_tfidf_c2000 <- ggplot(data=con_freq_tfidf,
                      aes(x=factor(nrow(con_freq_tfidf):1),
                          y=frequency)) +
  geom_point() +
  coord_flip() +
  scale_x_discrete(breaks=factor(nrow(con_freq_tfidf):1),
                   labels=con_freq_tfidf$feature) +
  labs(x=NULL, y="tf-idf")

tplot_tfidf_c2000

topfeatures(p2000_tfidf, n=20)
           mehr klimapolitische        anmelden      newsletter        laufende        erfahren          arbeit     information 
      21.685082       21.487854       21.303763       21.163076       20.840390       20.185371       17.596305       17.068803 
        bleiben           thema         aktuell            ikem          mensch         cookies         website     veränderung 
      16.172993       14.977431       14.130058       13.211684       12.981626       11.033872        5.354600        5.216797 
            uhr          stehen      disclosure    unterstützen 
       4.143985        3.929530        3.847595        3.835239 
topfeatures(c2000_tfidf, n=20)
      ...     admin kommentar     klima   energie      axel   göhring       jul    robert      frey     chris       feb 
25.995707 20.833266 13.313344 12.561506 11.308458 11.140143 11.094183 10.416316 10.078114  9.249402  9.229529  8.941108 
      apr       okt       jan       dez       jun       sep       mrz    demmig 
 8.725734  8.553627  8.532355  7.220623  7.057978  6.865806  6.737388  6.720881 
#p2000_weight

#textstat_frequency(p2000_tfidf, n=10)
dfm_klima
Document-feature matrix of: 4,000 documents, 2,575 features (99.86% sparse) and 3 docvars.
                  features
docs                    klima klimaschutzgesetze klimawandel klimafreundlich   klimazoll klimaschutz klimaschützer:innen
  kr_00007.txt     0.02142857        0.007142857 0.007142857     0.007142857 0.007142857 0.007142857         0.007142857
  ikem_01141.txt   0                 0           0               0           0           0                   0          
  fff_de_00121.txt 0                 0           0               0           0           0                   0          
  ikem_00898.txt   0                 0           0               0           0           0                   0          
  ikem_00709.txt   0                 0           0               0           0           0                   0          
  ikem_00588.txt   0                 0           0               0           0           0.003424658         0          
                  features
docs               klimaneutralität klimapolitische klimastreik
  kr_00007.txt          0.007142857      0           0         
  ikem_01141.txt        0                0.07142857  0         
  fff_de_00121.txt      0                0           0.01724138
  ikem_00898.txt        0                0           0         
  ikem_00709.txt        0                0           0         
  ikem_00588.txt        0                0           0         
[ reached max_ndoc ... 3,994 more documents, reached max_nfeat ... 2,565 more features ]

Comparison of Groups/Origin

Collocations

# to remove special chars from corpus
pro2000 <- gsub("\\|", "", pro2000)
pro2000 <- gsub("=", "", pro2000)

# convert into collocation dataframe
p_coll <- textstat_collocations(pro2000, min_count=50)
arrange(p_coll, desc(count))
de_stps
[1] "aber\\b|\\balle\\b|\\ballem\\b|\\ballen\\b|\\baller\\b|\\balles\\b|\\bals\\b|\\balso\\b|\\bam\\b|\\ban\\b|\\bander\\b|\\bandere\\b|\\banderem\\b|\\banderen\\b|\\banderer\\b|\\banderes\\b|\\banderm\\b|\\bandern\\b|\\banderr\\b|\\banders\\b|\\bauch\\b|\\bauf\\b|\\baus\\b|\\bbei\\b|\\bbin\\b|\\bbis\\b|\\bbist\\b|\\bda\\b|\\bdamit\\b|\\bdann\\b|\\bder\\b|\\bden\\b|\\bdes\\b|\\bdem\\b|\\bdie\\b|\\bdas\\b|\\bdaß\\b|\\bderselbe\\b|\\bderselben\\b|\\bdenselben\\b|\\bdesselben\\b|\\bdemselben\\b|\\bdieselbe\\b|\\bdieselben\\b|\\bdasselbe\\b|\\bdazu\\b|\\bdein\\b|\\bdeine\\b|\\bdeinem\\b|\\bdeinen\\b|\\bdeiner\\b|\\bdeines\\b|\\bdenn\\b|\\bderer\\b|\\bdessen\\b|\\bdich\\b|\\bdir\\b|\\bdu\\b|\\bdies\\b|\\bdiese\\b|\\bdiesem\\b|\\bdiesen\\b|\\bdieser\\b|\\bdieses\\b|\\bdoch\\b|\\bdort\\b|\\bdurch\\b|\\bein\\b|\\beine\\b|\\beinem\\b|\\beinen\\b|\\beiner\\b|\\beines\\b|\\beinig\\b|\\beinige\\b|\\beinigem\\b|\\beinigen\\b|\\beiniger\\b|\\beiniges\\b|\\beinmal\\b|\\ber\\b|\\bihn\\b|\\bihm\\b|\\bes\\b|\\betwas\\b|\\beuer\\b|\\beure\\b|\\beurem\\b|\\beuren\\b|\\beurer\\b|\\beures\\b|\\bfür\\b|\\bgegen\\b|\\bgewesen\\b|\\bhab\\b|\\bhabe\\b|\\bhaben\\b|\\bhat\\b|\\bhatte\\b|\\bhatten\\b|\\bhier\\b|\\bhin\\b|\\bhinter\\b|\\bich\\b|\\bmich\\b|\\bmir\\b|\\bihr\\b|\\bihre\\b|\\bihrem\\b|\\bihren\\b|\\bihrer\\b|\\bihres\\b|\\beuch\\b|\\bim\\b|\\bin\\b|\\bindem\\b|\\bins\\b|\\bist\\b|\\bjede\\b|\\bjedem\\b|\\bjeden\\b|\\bjeder\\b|\\bjedes\\b|\\bjene\\b|\\bjenem\\b|\\bjenen\\b|\\bjener\\b|\\bjenes\\b|\\bjetzt\\b|\\bkann\\b|\\bkein\\b|\\bkeine\\b|\\bkeinem\\b|\\bkeinen\\b|\\bkeiner\\b|\\bkeines\\b|\\bkönnen\\b|\\bkönnte\\b|\\bmachen\\b|\\bman\\b|\\bmanche\\b|\\bmanchem\\b|\\bmanchen\\b|\\bmancher\\b|\\bmanches\\b|\\bmein\\b|\\bmeine\\b|\\bmeinem\\b|\\bmeinen\\b|\\bmeiner\\b|\\bmeines\\b|\\bmit\\b|\\bmuss\\b|\\bmusste\\b|\\bnach\\b|\\bnicht\\b|\\bnichts\\b|\\bnoch\\b|\\bnun\\b|\\bnur\\b|\\bob\\b|\\boder\\b|\\bohne\\b|\\bsehr\\b|\\bsein\\b|\\bseine\\b|\\bseinem\\b|\\bseinen\\b|\\bseiner\\b|\\bseines\\b|\\bselbst\\b|\\bsich\\b|\\bsie\\b|\\bihnen\\b|\\bsind\\b|\\bso\\b|\\bsolche\\b|\\bsolchem\\b|\\bsolchen\\b|\\bsolcher\\b|\\bsolches\\b|\\bsoll\\b|\\bsollte\\b|\\bsondern\\b|\\bsonst\\b|\\büber\\b|\\bum\\b|\\bund\\b|\\buns\\b|\\bunse\\b|\\bunsem\\b|\\bunsen\\b|\\bunser\\b|\\bunses\\b|\\bunter\\b|\\bviel\\b|\\bvom\\b|\\bvon\\b|\\bvor\\b|\\bwährend\\b|\\bwar\\b|\\bwaren\\b|\\bwarst\\b|\\bwas\\b|\\bweg\\b|\\bweil\\b|\\bweiter\\b|\\bwelche\\b|\\bwelchem\\b|\\bwelchen\\b|\\bwelcher\\b|\\bwelches\\b|\\bwenn\\b|\\bwerde\\b|\\bwerden\\b|\\bwie\\b|\\bwieder\\b|\\bwill\\b|\\bwir\\b|\\bwird\\b|\\bwirst\\b|\\bwo\\b|\\bwollen\\b|\\bwollte\\b|\\bwürde\\b|\\bwürden\\b|\\bzu\\b|\\bzum\\b|\\bzur\\b|\\bzwar\\b|\\bzwischen\\b|\\bdass\\b|\\b=\\b|\\bthe\\b|\\bseit\\b|\\bab\\b|\\bbeim\\b|\\b\n\\b|\\bmal\\b|\\bc\\b|\\b\\|\\b|\\b|\\b|\\bm\\b|\\bkommentare\\b|\\bneueste\\b|\\bgepostet\\b|\\badmin\\b|\\bcookies\\b|\\binhalte\\b|\\binhalt\\b|\\bnewsletter\\b|\\bposten\\b|\\bzugriff\\b|\\bpasswort\\b|\\bgeschützt\\b|\\bseite\\b|\\bwebsite\\b|\\bwebseite\\b|\\band\\b|\\b0\\b|\\b1\\b|\\b2\\b|\\b3\\b|\\b4\\b|\\b5\\b|\\b6\\b|\\b7\\b|\\b8\\b|\\b9\\b|\\bmfg\\b|\\bw\\b|\\bt\\b|\\bwer"
p2000_coll_clean$collocation <- with(p2000_coll_clean, reorder(collocation, -count))
plot <- ggplot(p2000_coll_clean, aes(x=collocation, y=count)) + 
  geom_point()+ggtitle("P2000 Frequencies")+
  theme(axis.text.x = element_text(angle=90,hjust=1))
#ggsave(plot=plot1, width = 10, height = 5, dpi=300, filename="klima_eike_plot.jpeg" )
plot 

# collocations mit vorherigem stopwords removal: not working
p2000_toks <- tokens(pro2000)
p2000_toks_sw <- tokens_select(p2000_toks, pattern=full_stopwords, selection="remove")

p2000_coll <- textstat_collocations(p2000_toks_sw, min_count=3)
arrange(p2000_coll, desc(count))
summary(full_corpus, n=5)
Corpus consisting of 4000 documents, showing 5 documents:

             Text Types Tokens Sentences origin language     group
     kr_00007.txt   196    284        19     kr   german activists
   ikem_01141.txt    27     30         2   ikem   german activists
 fff_de_00121.txt   105    178        11 fff_de   german activists
   ikem_00898.txt   211    880        32   ikem   german activists
   ikem_00709.txt    20     43         3   ikem   german activists

Comparison Plots

#create input
corp <- dfm(full_corpus)
Warnung: 'dfm.corpus()' is deprecated. Use 'tokens()' first.
# lemmatisierung versuchen:



de_klima <- dfm_select(corp, pattern ="klima*")
de_relfreq <- dfm_weight(de_klima, scheme="prop")
de_freqs <- textstat_frequency(de_relfreq, groups=group)

#plotting 
freqs.act <- filter(de_freqs, group == "activists") %>% as.data.frame() %>% select(feature, frequency)
freqs.scept <- filter(de_freqs, group == "sceptics") %>% as.data.frame() %>% select(feature, frequency)
freqs <- left_join(freqs.act, freqs.scept, by = "feature") %>% head(30) %>% arrange(frequency.x) %>% mutate(feature = factor(feature, feature))
ggplot(freqs) +
  geom_segment(aes(x=feature, xend=feature, y=frequency.x, yend=frequency.y), color="grey") +
  geom_point(aes(x=feature, y=frequency.x), color = "red", size = 3 ) +
  geom_point(aes(x=feature, y=frequency.y), color = "lightblue", size = 3 ) +
  ggtitle("Word Frequencies") + 
  xlab("") + ylab("Wortfrequenz") + 
  coord_flip()
Warnung: Removed 1 rows containing missing values (geom_segment).
Warnung: Removed 1 rows containing missing values (geom_point).

freqs.act 
freqs.scept
# to get lemmatized dfm 
sp_pro2000_dfm <- as.tokens(sp_pro2000) %>%
  dfm()

sp_con2000_dfm <- as.tokens(sp_contra2000) %>%
  dfm()
de_klima_pro <- dfm_select(sp_pro2000_dfm, pattern ="klima*")
de_relfreq_pro <- dfm_weight(de_klima_pro, scheme="prop")
de_freqs_pro <- textstat_frequency(de_relfreq_pro)

de_klima_con <- dfm_select(sp_con2000_dfm, pattern ="klima*")
de_relfreq_con <- dfm_weight(de_klima_con, scheme="prop")
de_freqs_con <- textstat_frequency(de_relfreq_con)


#plotting 
freqs.act <- filter(de_freqs_pro) %>% as.data.frame() %>% select(feature, frequency)
freqs.scept <- filter(de_freqs_con) %>% as.data.frame() %>% select(feature, frequency)
freqs <- left_join(freqs.act, freqs.scept, by = "feature") %>% head(30) %>% arrange(frequency.x) %>% mutate(feature = factor(feature, feature))
p <- ggplot(freqs) +
    geom_segment(aes(x=feature, xend=feature, y=frequency.x, yend=frequency.y), color="grey") +
    geom_point(aes(x=feature, y=frequency.x, colour="Activists"), size = 3) +
    geom_point(aes(x=feature, y=frequency.y, colour="Sceptics"), size = 3 ) +
    ggtitle("Word Frequencies") + 
    xlab("") + ylab("Frequency") +
    coord_flip()

p+labs(colour="Group")
Warnung: Removed 1 rows containing missing values (geom_segment).
Warnung: Removed 1 rows containing missing values (geom_point).

dfm_weight_corp <- full_corpus %>%
  tokens(remove_punct = TRUE) %>%
  tokens_remove(de_stopwords1) %>%
  dfm() %>%
  dfm_weight(scheme = "prop")

# Calculate relative frequency by president
freq_weight <- textstat_frequency(dfm_weight_corp, n = 10, 
                                  groups = dfm_weight_corp$origin)

ggplot(data = freq_weight, aes(x = nrow(freq_weight):1, y = frequency)) +
     geom_point() +
     facet_wrap(~ group, scales = "free") +
     coord_flip() +
     scale_x_continuous(breaks = nrow(freq_weight):1,
                        labels = freq_weight$feature) +
     labs(x = NULL, y = "Relative frequency")

summary(full_corpus, n=10)
Corpus consisting of 4000 documents, showing 10 documents:

             Text Types Tokens Sentences origin language     group
     kr_00007.txt   196    284        19     kr   german activists
   ikem_01141.txt    27     30         2   ikem   german activists
 fff_de_00121.txt   105    178        11 fff_de   german activists
   ikem_00898.txt   211    880        32   ikem   german activists
   ikem_00709.txt    20     43         3   ikem   german activists
   ikem_00588.txt   210    605        11   ikem   german activists
     kr_00036.txt   415    695        30     kr   german activists
   ikem_00627.txt   354   1054        23   ikem   german activists
   ikem_00532.txt   277    530        29   ikem   german activists
   ikem_00518.txt   140    233         6   ikem   german activists

Keyness

Comparison Cloud

full_corpus %>%
    tokens(remove_punct = TRUE, remove_numbers=TRUE) %>%
    tokens_remove(de_stopwords1) %>%
    dfm() %>%
    dfm_group(groups = group) %>%
    dfm_trim(min_termfreq = 5, verbose = FALSE) %>%
    textplot_wordcloud(comparison = TRUE, max_words=100)

                       #,color=c("lightblue","blue"))
textplot_xray(
    kwic(tokens(pro2000), pattern = "klima*"),
    kwic(tokens(contra2000), pattern = "klima*"))

Topic Modeling

library(tidytext)
Fehler in library(tidytext) : es gibt kein Paket namens ‘tidytext’
dfm_full <- dfm(full_corpus, remove=de_stopwords1, remove_punct=TRUE, remove_numbers=TRUE)
dfm_full

tm_full<-convert(dfm_full, to="topicmodels")

topicModel <- LDA(tm_full, k=5, method="Gibbs", control=list(iter = 500, verbose = 25))
terms(topicModel, 10)

Ideas: DONE: Wordcloud Plot of Comparison Group: https://quanteda.io/articles/pkgdown/examples/plotting.html

Lexical Dispersion Plot (X-Ray) -> could be done for keywords "klima*"

Next: - Calculate “Corpus Similarity” - DONE: Klimawörter Liste mit Group und Counts abspeichern -> welche Klimawörter gibt es wo und wie oft - Analyse der Ergebnisse - Literatur-Recherche zu den Textmining Themen

Topic Modeling https://www.tidytextmining.com/topicmodeling.html

LS0tCnRpdGxlOiAiRW1waXJpY2FsIFdvcmsgLSBDbGltYXRlIENoYW5nZSBEaXNjb3Vyc2UgQ29ycG9yYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgojIyBMb2FkaW5nIExpYnJhcmllcwoKYGBge3J9CiMgbG9hZCBsaWJyYXJpZXMKCmxpYnJhcnkocXVhbnRlZGEpCmxpYnJhcnkocmVhZHRleHQpCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeSh3b3JkY2xvdWQyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0bSkKbGlicmFyeSgidGV4dGNhdCIpCmxpYnJhcnkoInF1YW50ZWRhLnRleHRwbG90cyIpCmxpYnJhcnkoInF1YW50ZWRhLnRleHRzdGF0cyIpCmxpYnJhcnkoImdzdWJmbiIpCmxpYnJhcnkoInNwYWN5ciIpCgpzcGFjeV9pbml0aWFsaXplKG1vZGVsID0gImRlX2NvcmVfbmV3c19zbSIpCmBgYAoKIyMgU3RhcnQgaGVyZSB0byBsb2FkIGV4aXN0aW5nIGNvcnBvcmE6CgpgYGB7cn0KIyBsb2FkIGNvcnB1cyBmaWxlcyAKZnVsbF9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2Z1bGxfY29ycHVzLnJkcyIpCmZ1bGxfY29ycHVzX3NlbnRzID0gcmVhZFJEUygiY29ycG9yYS9mdWxsX2NvcnB1c19zZW50cy5yZHMiKQoKcHJvX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvcHJvX2NvcnB1cy5yZHMiKQpjb250cmFfY29ycHVzID0gcmVhZFJEUygiY29ycG9yYS9jb250cmFfY29ycHVzLnJkcyIpCgpwcm8yMDAwID0gcmVhZFJEUygiY29ycG9yYS9wcm8yMDAwLnJkcyIpCnBybzkwMCA9IHJlYWRSRFMoImNvcnBvcmEvcHJvOTAwLnJkcyIpCmNvbnRyYTIwMDAgPSByZWFkUkRTKCJjb3Jwb3JhL2NvbnRyYTIwMDAucmRzIikKY29udHJhOTAwID0gcmVhZFJEUygiY29ycG9yYS9jb250cmE5MDAucmRzIikKCmZmZl9kZV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2ZmZl9kZV9jb3JwdXMucmRzIikKaWtlbV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2lrZW1fY29ycHVzLnJkcyIpCmtsaW1hcmVwX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEva2xpbWFyZXBfY29ycHVzLnJkcyIpCmtsaW1hZmFrdGVuX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEva2xpbWFmYWt0ZW5fY29ycHVzLnJkcyIpCnplcm9fY29ycHVzID0gcmVhZFJEUygiY29ycG9yYS96ZXJvX2NvcnB1cy5yZHMiKQprb21tYV9jb3JwdXMgPSByZWFkUkRTKCJjb3Jwb3JhL2tvbW1hX2NvcnB1cy5yZHMiKQplaWtlX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvZWlrZV9jb3JwdXMucmRzIikKZmZoX2NvcnB1cyA9IHJlYWRSRFMoImNvcnBvcmEvZmZoX2NvcnB1cy5yZHMiKQpgYGAKIyBFeHBsb3JpbmcgdGhlIGNvcnB1cwoKYGBge3J9CnN1bW1hcnkocHJvMjAwMCwgbiA9IDEwKQpzdW1tYXJ5KGNvbnRyYTIwMDAsIG49MTApCmBgYAoKIyMgQ29ycHVzIHN0YXRpc3RpY3MKCmBgYHtyfQojIHRvIGdldCBpbmRleCBudW1iZXIgCiNpZF9wcm8gPSAxOm5kb2MocHJvOTAwKSAKYGBgCgojIFBsb3R0aW5nIE51bWJlciBvZiBTZW50ZW5jZXMKCmBgYHtyfQpjb250cmEyMDAwX3N1bSA8LSBzdW1tYXJ5KGNvbnRyYTIwMDApCnBybzIwMDBfc3VtIDwtIHN1bW1hcnkocHJvMjAwMCkKcHJvOTAwX3N1bSA8LSBzdW1tYXJ5KHBybzkwMCwgbmRvYyhwcm85MDApKQpjb250cmE5MDBfc3VtIDwtIHN1bW1hcnkoY29udHJhOTAwLCBuZG9jKGNvbnRyYTkwMCkpCgoKI3RvIGdldCBpZCBhcyB4IGF4aXMKI2lkX3Byb1sxOjEwMF0KI2NvbnRyYTkwMF9zdW0kaWQKCmdncGxvdChwcm8yMDAwX3N1bSwgYWVzKGlkLCBTZW50ZW5jZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlNlbnRlbmNlcyBQcm8yMDAwIikKCmdncGxvdChjb250cmEyMDAwX3N1bSwgYWVzKGlkLCBTZW50ZW5jZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlNlbnRlbmNlcyBDb250cmEyMDAwIikKCmBgYAoKYGBge3J9CnBybzkwMF9zdW0gPC0gc3VtbWFyeShwcm85MDAsIG49MTAwKQpjb250cmE5MDBfc3VtIDwtIHN1bW1hcnkoY29udHJhOTAwLCBuPTEwMCkKCgpnZ3Bsb3QocHJvOTAwX3N1bSwgYWVzKHBybzkwMF9zdW0kaWQsIFRva2VucywgZ3JvdXA9MSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVG9rZW5zIFBybzkwMCIpCgpnZ3Bsb3QoY29udHJhOTAwX3N1bSwgYWVzKGNvbnRyYTkwMF9zdW0kaWQsIFRva2VucywgZ3JvdXA9MSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVG9rZW5zIENvbnRyYTkwMCIpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QocHJvOTAwX3N1bSwgYWVzKHBybzkwMF9zdW0kaWQsIFR5cGVzLCBncm91cD0xKSkgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MCwgdmp1c3Q9MSwgaGp1c3Q9MSkpICsgCiAgZ2d0aXRsZSgiVHlwZXMgUHJvOTAwIikKCmdncGxvdChjb250cmE5MDBfc3VtLCBhZXMoY29udHJhOTAwX3N1bSRpZCwgVHlwZXMsIGdyb3VwPTEpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHZqdXN0PTEsIGhqdXN0PTEpKSArIAogIGdndGl0bGUoIlR5cGVzIENvbnRyYTkwMCIpCgoKYGBgCgpgYGB7cn0KZ2dwbG90KHBybzkwMF9zdW0sIGFlcyhUb2tlbnMsIFR5cGVzLCBncm91cD0xLCBsYWJlbD0gaWQpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9InkgfiB4Iiwgc2UgPSBGQUxTRSkgKwogIGdlb21fdGV4dChjaGVja19vdmVybGFwID0gVCkgKwogIGdndGl0bGUoIlR5cGUtVG9rZW4tUmVsYXRpb24gUHJvOTAwIikKCmdncGxvdChjb250cmE5MDBfc3VtLCBhZXMoVG9rZW5zLCBUeXBlcywgZ3JvdXA9MSwgbGFiZWw9IGlkKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSJ5IH4geCIsIHNlID0gRkFMU0UpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcCA9IFQpICsKICBnZ3RpdGxlKCJUeXBlLVRva2VuLVJlbGF0aW9uIENvbnRyYTkwMCIpCmBgYAo8PDw8PDw8IFVwZGF0ZWQgdXBzdHJlYW0KIyBXb3JkIEZyZXF1ZW5jaWVzCgoKIyMgMS4gU3RlcDogQ3JlYXRlIERGTSwgTG9hZCBTdG9wbGlzdHMgCmBgYHtyfQojIHN0b3BsaXN0cwpkZV9zdG9wd29yZHMgPC0gc3RvcHdvcmRzOjpzdG9wd29yZHMoImRlIiwgc291cmNlPSJzbm93YmFsbCIpCmVuX3N0b3B3b3JkcyA8LSBzdG9wd29yZHM6OnN0b3B3b3JkcygiZW4iLCBzb3VyY2U9InNub3diYWxsIiApCmN1c3RvbV9zdG9wd29yZHMgPC0gcmVhZC50YWJsZSgiZGVfY29tcGxldGUudHh0IiwgaGVhZGVyPUYsIHNlcD0iXG4iKQoKIyBhZGQgb3duIHN0b3B3b3JkcyAKZnVsbF9zdG9wd29yZHMgPC0gYyhkZV9zdG9wd29yZHMsICJkYXNzIiwgIj0iLCAidGhlIiwgInNlaXQiLCAiYWIiLCAiYmVpbSIsICJcbiIsICJtYWwiLCAiYyIsICJ8IiwgIm0iLCAia29tbWVudGFyZSIsICJuZXVlc3RlIiwgImdlcG9zdGV0IiwgY3VzdG9tX3N0b3B3b3JkcywgZW5fc3RvcHdvcmRzKQpkZV9zdG9wd29yZHMxIDwtIGMoZGVfc3RvcHdvcmRzLCAiZGFzcyIsICI9IiwgInRoZSIsICJzZWl0IiwgImFiIiwgImJlaW0iLCAiXG4iLCAibWFsIiwgImMiLCAiXFx8IiwifCIsICJtIiwgImtvbW1lbnRhcmUiLCAibmV1ZXN0ZSIsICJnZXBvc3RldCIsICJhZG1pbiIsICJjb29raWVzIiwgImluaGFsdGUiLCAiaW5oYWx0IiwgIm5ld3NsZXR0ZXIiLCAicG9zdGVuIiwgInp1Z3JpZmYiLCAicGFzc3dvcnQiLCAiZ2VzY2jDvHR6dCIsICJzZWl0ZSIsICJ3ZWJzaXRlIiwgIndlYnNlaXRlIiwgImFuZCIsICIwIiwgIjEiLCAiMiIsICIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwgIm1mZyIsInciLCJ0Iiwid2VyIikKCgojIGNyZWF0ZSBkZm0KZGZtX3AyMDAwIDwtIGRmbShwcm8yMDAwLCByZW1vdmU9ZnVsbF9zdG9wd29yZHMsIHJlbW92ZV9wdW5jdD1UUlVFLCByZW1vdmVfbnVtYmVycz1UUlVFKQpkZm1fYzIwMDAgPC0gZGZtKGNvbnRyYTIwMDAsIHJlbW92ZT1mdWxsX3N0b3B3b3JkcywgcmVtb3ZlX3B1bmN0PVRSVUUsIHJlbW92ZV9udW1iZXJzPVRSVUUpCmBgYAoKIyMgQ29ycHVzIENsZWFuaW5nOiBMZW1tYXRpemF0aW9uIC0+IG5ldyBsZW1tYXRpemVkIGRmbQpgYGB7cn0KIyBwcm8gCnNwX3BybzIwMDAgPC0gc3BhY3lfcGFyc2UocHJvMjAwMCwgcG9zPUZBTFNFLCBlbnRpdHk9RkFMU0UsIGRlcGVuZGVuY3k9RkFMU0UpCnNwX3BybzIwMDAkdG9rZW4gPC0gc3BfcHJvMjAwMCRsZW1tYQoKc3BfZGZtX3AyMDAwIDwtIGFzLnRva2VucyhzcF9wcm8yMDAwKSU+JQogIGRmbShyZW1vdmU9ZnVsbF9zdG9wd29yZHMsIHJlbW92ZV9wdW5jdD1UUlVFLCByZW1vdmVfbnVtYmVycz1UUlVFLCB0b2xvd2VyPVRSVUUpCgojIGNvbnRyYQpzcF9jb250cmEyMDAwIDwtIHNwYWN5X3BhcnNlKGNvbnRyYTIwMDAsIHBvcz1GQUxTRSwgZW50aXR5PUZBTFNFLCBkZXBlbmRlbmN5PUZBTFNFKQpzcF9jb250cmEyMDAwJHRva2VuIDwtIHNwX2NvbnRyYTIwMDAkbGVtbWEKCnNwX2RmbV9jMjAwMCA8LSBhcy50b2tlbnMoc3BfY29udHJhMjAwMCklPiUKICBkZm0ocmVtb3ZlPWZ1bGxfc3RvcHdvcmRzLCByZW1vdmVfcHVuY3Q9VFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSwgdG9sb3dlcj1UUlVFKQpgYGAKYGBge3J9CnNwX2Z1bGwgPC0gc3BhY3lfcGFyc2UoZnVsbF9jb3JwdXMsIHBvcz1GQUxTRSwgZW50aXR5PUZBTFNFLCBkZXBlbmRlbmN5PUZBTFNFKQpzcF9mdWxsJHRva2VuIDwtIHNwX2Z1bGwkbGVtbWEKCnNwX2RmbV9mdWxsIDwtIGFzLnRva2VucyhzcF9mdWxsKSAlPiUKICBkZm0ocmVtb3ZlPWZ1bGxfc3RvcHdvcmRzLCByZW1vdmVfcHVuY3Q9VFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSwgdG9sb3dlcj1UUlVFKQpgYGAKCmBgYHtyfQpkZm1fcDIwMDAKZGZtX2MyMDAwCmBgYAoKIyMgMi4gU3RlcDogQ2hlY2sgVG9wZmVhdHVyZXMgb2YgREZNIC0+IG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyB0ZXJtcwpgYGB7cn0KdG9wZmVhdHVyZXMoc3BfZGZtX3AyMDAwLCBuPTUwKQp0b3BmZWF0dXJlcyhzcF9kZm1fYzIwMDAsIG49NTApCmBgYAoKYGBge3J9CnRmX3AyMDAwIDwtIHRvcGZlYXR1cmVzKHNwX2RmbV9wMjAwMCwgbj01MCkKdGZfYzIwMDAgPC0gdG9wZmVhdHVyZXMoc3BfZGZtX2MyMDAwLCBuPTUwKQpgYGAKYGBge3J9CnRleHRzdGF0X2ZyZXF1ZW5jeShzcF9kZm1fcDIwMDAsIG49NTApCmBgYAoKIyMgUGxvdHRpbmcgd29yZCBmcmVxdWVuY2llcwoKYGBge3J9CmtsaW1hX3AyMDAwIDwtIGRmbV9zZWxlY3Qoc3BfZGZtX3AyMDAwLCBwYXR0ZXJuPSJrbGltYSoiKQprbGltYV9jMjAwMCA8LSBkZm1fc2VsZWN0KHNwX2RmbV9jMjAwMCwgcGF0dGVybj0ia2xpbWEqIikKYGBgCgpgYGB7cn0Ka2xpbWFfdGVybXNfcDIwMDAgPC0gdG9wZmVhdHVyZXMoa2xpbWFfcDIwMDAsIG49MTAwKQprbGltYV90ZXJtc19jMjAwMCA8LSB0b3BmZWF0dXJlcyhrbGltYV9jMjAwMCwgbj0xMDApCmBgYAoKYGBge3J9CmZyZXFfcDIwMDAgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KHNwX2RmbV9wMjAwMCwgbj01MCkKZnJlcV9jMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koc3BfZGZtX2MyMDAwLCBuPTUwKQoKcGxvdF9wMjAwMCA8LSB3aXRoKGZyZXFfcDIwMDAsIHJlb3JkZXIoZmVhdHVyZSwgLWZyZXF1ZW5jeSkpCnBsb3RfYzIwMDAgPC0gd2l0aChmcmVxX2MyMDAwLCByZW9yZGVyKGZlYXR1cmUsIC1mcmVxdWVuY3kpKQoKI2NyZWF0ZSBwbG90IGZvciBlaWtlIGtsaW1hIHdvcmRzIGZyZXF1ZW5jaWVzCnBsb3QxIDwtIGdncGxvdChmcmVxX3AyMDAwLCBhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludCgpK2dndGl0bGUoIlAyMDAwIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpCiNnZ3NhdmUocGxvdD1wbG90MSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgZHBpPTMwMCwgZmlsZW5hbWU9ImtsaW1hX2Vpa2VfcGxvdC5qcGVnIiApCnBsb3QxCgojY3JlYXRlIHBsb3QgZm9yIGtsaW1hcmVwb3J0ZXIga2xpbWEgd29yZHMgZnJlcXVlbmNpZXMKcGxvdDIgPC0gZ2dwbG90KGZyZXFfYzIwMDAsIGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5KSkgKyAKICBnZW9tX3BvaW50KCkrIGdndGl0bGUoIkMyMDAwIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpIAogIAojZ2dzYXZlKHBsb3Q9cGxvdDIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9rbGltYXJlcF9wbG90LmpwZWciICkKcGxvdDIKYGBgCiMjIFNhbWUgUGxvdCBmb3IgIktsaW1hIiBXb3JkcwpgYGB7cn0KZnJlcV9rbGltYV9wMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koa2xpbWFfcDIwMDAsIG49NTApCmZyZXFfa2xpbWFfYzIwMDAgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGtsaW1hX2MyMDAwLCBuPTUwKQoKZnJlcV9rbGltYV9wMjAwMCRmZWF0dXJlIDwtIHdpdGgoZnJlcV9rbGltYV9wMjAwMCwgcmVvcmRlcihmZWF0dXJlLCAtZnJlcXVlbmN5KSkKZnJlcV9rbGltYV9jMjAwMCRmZWF0dXJlIDwtIHdpdGgoZnJlcV9rbGltYV9jMjAwMCwgcmVvcmRlcihmZWF0dXJlLCAtZnJlcXVlbmN5KSkKCiNjcmVhdGUgcGxvdCBmb3IgZWlrZSBrbGltYSB3b3JkcyBmcmVxdWVuY2llcwpwbG90MSA8LSBnZ3Bsb3QoZnJlcV9rbGltYV9wMjAwMCwgYWVzKHg9ZmVhdHVyZSwgeT1mcmVxdWVuY3kpKSArIAogIGdlb21fcG9pbnQoKStnZ3RpdGxlKCJQMjAwMCBLbGltYXfDtnJ0ZXIgRnJlcXVlbmNpZXMiKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xKSkKI2dnc2F2ZShwbG90PXBsb3QxLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCBkcGk9MzAwLCBmaWxlbmFtZT0ia2xpbWFfZWlrZV9wbG90LmpwZWciICkKcGxvdDEKCiNjcmVhdGUgcGxvdCBmb3Iga2xpbWFyZXBvcnRlciBrbGltYSB3b3JkcyBmcmVxdWVuY2llcwpwbG90MiA8LSBnZ3Bsb3QoZnJlcV9rbGltYV9jMjAwMCwgYWVzKHg9ZmVhdHVyZSwgeT1mcmVxdWVuY3kpKSArIAogIGdlb21fcG9pbnQoKSsgZ2d0aXRsZSgiQzIwMDAgS2xpbWF3w7ZydGVyIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpIAogIAojZ2dzYXZlKHBsb3Q9cGxvdDIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9rbGltYXJlcF9wbG90LmpwZWciICkKcGxvdDIKYGBgCmBgYHtyfQojIHRvIHNhdmUgbGlzdHMgb2Yga2xpbWEtd29yZHMgCiMgdy9vICIkZmVhdHVyZSIgaXQgc2F2ZXMgdGhlIHdob2xlIHRhYmxlIGFzIHRleHQgZmlsZSAod2l0aCBmcmVxdWVuY3kgaW5mbyBldGMuKQojY2FwdHVyZS5vdXRwdXQobGlzdChmcmVxX2tsaW1hX3AyMDAwJGZlYXR1cmUpLCBmaWxlID0gInRlcm1zX3Byby50eHQiKQojY2FwdHVyZS5vdXRwdXQobGlzdChmcmVxX2tsaW1hX2MyMDAwJGZlYXR1cmUpLCBmaWxlID0gInRlcm1zX2NvbnRyYS50eHQiKQpgYGAKCiMjIFBsb3QgVEYtSURGIChub3Qgd29ya2luZyB5ZXQhISEpCmBgYHtyfQojIHdlaWdodGVkIHdvcmRzCnAyMDAwX3dlaWdodCA8LSBkZm1fd2VpZ2h0KHNwX2RmbV9wMjAwMCwgc2NoZW1lPSJwcm9wIikKYzIwMDBfd2VpZ2h0IDwtIGRmbV93ZWlnaHQoc3BfZGZtX2MyMDAwLCBzY2hlbWU9InByb3AiKQoKcmVsZnJlcV9wMjAwMCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3kocDIwMDBfd2VpZ2h0LCBuPTUwKQpyZWxmcmVxX2MyMDAwIDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShjMjAwMF93ZWlnaHQsIG49NTApCgojdGZpZGYKcDIwMDBfdGZpZGYgPC0gZGZtX3RmaWRmKHNwX2RmbV9wMjAwMCwgc2NoZW1lX3RmID0gInByb3AiKQpjMjAwMF90ZmlkZiA8LSBkZm1fdGZpZGYoc3BfZGZtX2MyMDAwLCBzY2hlbWVfdGYgPSAicHJvcCIpCgojcGxvdDMgPC0gd2l0aChyZWxmcmVxX3AyMDAwLCByZW9yZGVyKGZlYXR1cmUsIC1mcmVxZW5jeSkpCnJlbGZyZXFfcDIwMDAkZmVhdHVyZSA8LSB3aXRoKHJlbGZyZXFfcDIwMDAsIHJlb3JkZXIoZmVhdHVyZSwgLWZyZXF1ZW5jeSkpCnBsb3QzIDwtIGdncGxvdChyZWxmcmVxX3AyMDAwLCBhZXMoeD1mZWF0dXJlLCB5PWZyZXF1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludCgpK2dndGl0bGUoIlAyMDAwIEZyZXF1ZW5jaWVzIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSkpCiNnZ3NhdmUocGxvdD1wbG90MSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgZHBpPTMwMCwgZmlsZW5hbWU9ImtsaW1hX2Vpa2VfcGxvdC5qcGVnIiApCnBsb3QzCmBgYAoKYGBge3J9CnByb19mcmVxX3RmaWRmIDwtIHAyMDAwX3RmaWRmICU+JQogIHRleHRzdGF0X2ZyZXF1ZW5jeShuPTEwLCBmb3JjZT1UUlVFKQoKY29uX2ZyZXFfdGZpZGYgPC0gYzIwMDBfdGZpZGYgJT4lCiAgdGV4dHN0YXRfZnJlcXVlbmN5KG49MTAsIGZvcmNlPVRSVUUpCgp0cGxvdF90ZmlkZl9wMjAwMCA8LSBnZ3Bsb3QoZGF0YT1wcm9fZnJlcV90ZmlkZiwKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4PWZhY3Rvcihucm93KHByb19mcmVxX3RmaWRmKToxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB5PWZyZXF1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9ZmFjdG9yKG5yb3cocHJvX2ZyZXFfdGZpZGYpOjEpLAogICAgICAgICAgICAgICAgICAgbGFiZWxzPXByb19mcmVxX3RmaWRmJGZlYXR1cmUpICsKICBsYWJzKHg9TlVMTCwgeT0idGYtaWRmIikKCnRwbG90X3RmaWRmX3AyMDAwCgp0cGxvdF90ZmlkZl9jMjAwMCA8LSBnZ3Bsb3QoZGF0YT1jb25fZnJlcV90ZmlkZiwKICAgICAgICAgICAgICAgICAgICAgIGFlcyh4PWZhY3Rvcihucm93KGNvbl9mcmVxX3RmaWRmKToxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB5PWZyZXF1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9ZmFjdG9yKG5yb3coY29uX2ZyZXFfdGZpZGYpOjEpLAogICAgICAgICAgICAgICAgICAgbGFiZWxzPWNvbl9mcmVxX3RmaWRmJGZlYXR1cmUpICsKICBsYWJzKHg9TlVMTCwgeT0idGYtaWRmIikKCnRwbG90X3RmaWRmX2MyMDAwCmBgYAoKYGBge3J9CnRvcGZlYXR1cmVzKHAyMDAwX3RmaWRmLCBuPTIwKQp0b3BmZWF0dXJlcyhjMjAwMF90ZmlkZiwgbj0yMCkKI3AyMDAwX3dlaWdodAoKI3RleHRzdGF0X2ZyZXF1ZW5jeShwMjAwMF90ZmlkZiwgbj0xMCkKYGBgCgpgYGB7cn0KZGZtX2tsaW1hIDwtIGRmbV9zZWxlY3QoZGZtX3dlaWdodF9vcmlnaW4sIHBhdHRlcm4gPSJrbGltYSoiKQpkZm1fa2xpbWEKYGBgCgojIyMgQ29tcGFyaXNvbiBvZiBHcm91cHMvT3JpZ2luCmBgYHtyfQpkZm1fd2VpZ2h0X29yaWdpbiA8LSBmdWxsX2NvcnB1cyAlPiUKICAjY29ycHVzX3N1YnNldChvcmlnaW4gPiAyMDAwKSAlPiUKICB0b2tlbnMocmVtb3ZlX3B1bmN0ID0gVFJVRSkgJT4lCiAgdG9rZW5zX3JlbW92ZShkZV9zdG9wd29yZHMxKSAlPiUKICBkZm0oKSAlPiUKICBkZm1fd2VpZ2h0KHNjaGVtZSA9ICJwcm9wIikKCiMgQ2FsY3VsYXRlIHJlbGF0aXZlIGZyZXF1ZW5jeSBieSBwcmVzaWRlbnQKZnJlcV93ZWlnaHQgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGRmbV93ZWlnaHRfb3JpZ2luLCBuID0gMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gZGZtX3dlaWdodF9vcmlnaW4kZ3JvdXApICMgY2hhbmdlIHRvICJvcmlnaW4iIGhlcmUgdG8gc2VlIGZvciBhbGwgd2Vic2l0ZXMgCgojIHVzZSB0aGlzIGxpbmUgaW5zdGVhZCBvZiB0aGUgb25lIGFib3ZlIHRvIGdldCAia2xpbWEiIHRlcm1zIApmcmVxX3dlaWdodCA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koZGZtX2tsaW1hLCBuPTE1LCBncm91cHM9ZGZtX3dlaWdodF9vcmlnaW4kb3JpZ2luKQoKZ2dwbG90KGRhdGEgPSBmcmVxX3dlaWdodCwgYWVzKHggPSBucm93KGZyZXFfd2VpZ2h0KToxLCB5ID0gZnJlcXVlbmN5KSkgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgZmFjZXRfd3JhcCh+IGdyb3VwLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgICBjb29yZF9mbGlwKCkgKwogICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBucm93KGZyZXFfd2VpZ2h0KToxLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBmcmVxX3dlaWdodCRmZWF0dXJlKSArCiAgICAgbGFicyh4ID0gTlVMTCwgeSA9ICJSZWxhdGl2ZSBmcmVxdWVuY3kiKQoKZ2dzYXZlKCJmaWd1cmVfUExPVC5wbmciLCBkcGk9MzAwLCBkZXY9J3BuZycsIGhlaWdodD0xMCwgd2lkdGg9MTUsIHVuaXRzPSJpbiIpCmBgYAojIENvbGxvY2F0aW9ucwpgYGB7cn0KIyB0byByZW1vdmUgc3BlY2lhbCBjaGFycyBmcm9tIGNvcnB1cwpwcm8yMDAwIDwtIGdzdWIoIlxcfCIsICIiLCBwcm8yMDAwKQpwcm8yMDAwIDwtIGdzdWIoIj0iLCAiIiwgcHJvMjAwMCkKCiMgY29udmVydCBpbnRvIGNvbGxvY2F0aW9uIGRhdGFmcmFtZQpwX2NvbGwgPC0gdGV4dHN0YXRfY29sbG9jYXRpb25zKHBybzIwMDAsIG1pbl9jb3VudD01MCkKYXJyYW5nZShwX2NvbGwsIGRlc2MoY291bnQpKQpgYGAKYGBge3J9CmRlX3N0cHMKYGBgCgoKYGBge3J9CiMgdHJhbnNmb3JtIHN0b3BsaXN0cyBmb3IgZHBseXI6OmZpbHRlciBmdW5jdGlvbiAod2h5PykKZGVfc3RwcyA8LSBwYXN0ZTAoZGVfc3RvcHdvcmRzLCBjb2xsYXBzZSA9ICJcXGJ8XFxiIikKZW5fc3RwcyA8LSBwYXN0ZTAoZW5fc3RvcHdvcmRzLCBjb2xsYXBzZSA9ICJcXGJ8XFxiIikKCiMgcmVtb3ZlIGVudHJpZXMgaW52b2x2aW5nIHN0b3B3b3JkczogTk9UIFdPUktJTkcgWUVUIQpwMjAwMF9jb2xsX2NsZWFuIDwtIHBfY29sbCAlPiUKICBkcGx5cjo6ZmlsdGVyKCFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCBkZV9zdHBzKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCBlbl9zdHBzKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiPSIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICIwMCIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICIzMCIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICI+IiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIm5ld3NsZXR0ZXIiKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiYW5tZWxkZW4iKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiXFwrIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIjQwIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIjgxIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgImVybmV1ZXJiYXJlciIpKQoKI3AyMDAwX2NvbGxfY2xlYW4KYXJyYW5nZShwMjAwMF9jb2xsX2NsZWFuLCBkZXNjKGNvdW50KSkKYGBgCmBgYHtyfQoKY19jb2xsIDwtIHRleHRzdGF0X2NvbGxvY2F0aW9ucyhjb250cmEyMDAwLCBtaW5fY291bnQ9NTApCgojIHJlbW92ZSBlbnRyaWVzIGludm9sdmluZyBzdG9wd29yZHM6IE5PVCBXT1JLSU5HIFlFVCEKYzIwMDBfY29sbF9jbGVhbiA8LSBjX2NvbGwgJT4lCiAgZHBseXI6OmZpbHRlcighc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgZGVfc3RwcyksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgZW5fc3RwcyksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIj0iKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiMDAiKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiMzAiKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiPiIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICJuZXdzbGV0dGVyIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgImFubWVsZGVuIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgIlxcKyIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICI0MCIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICI4MSIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICJlcm5ldWVyYmFyZXIiKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAia29tbWVudGFyZSIpLAogICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoY29sbG9jYXRpb24sICJcXHwiKSwKICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KGNvbGxvY2F0aW9uLCAiXFxeIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgImdyw7zDn2VuIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgImdlZWhydGVyIiksCiAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChjb2xsb2NhdGlvbiwgImdsb2JhbGVuIikpCiNwMjAwMF9jb2xsX2NsZWFuCmFycmFuZ2UoYzIwMDBfY29sbF9jbGVhbiwgZGVzYyhjb3VudCkpCmBgYAoKCmBgYHtyfQpwMjAwMF9jb2xsX2NsZWFuJGNvbGxvY2F0aW9uIDwtIHdpdGgocDIwMDBfY29sbF9jbGVhbiwgcmVvcmRlcihjb2xsb2NhdGlvbiwgLWNvdW50KSkKcGxvdCA8LSBnZ3Bsb3QocDIwMDBfY29sbF9jbGVhbiwgYWVzKHg9Y29sbG9jYXRpb24sIHk9Y291bnQpKSArIAogIGdlb21fcG9pbnQoKStnZ3RpdGxlKCJQMjAwMCBGcmVxdWVuY2llcyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEpKQojZ2dzYXZlKHBsb3Q9cGxvdDEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIGRwaT0zMDAsIGZpbGVuYW1lPSJrbGltYV9laWtlX3Bsb3QuanBlZyIgKQpwbG90IAoKYGBgCgpgYGB7cn0KIyBjb2xsb2NhdGlvbnMgbWl0IHZvcmhlcmlnZW0gc3RvcHdvcmRzIHJlbW92YWw6IG5vdCB3b3JraW5nCnAyMDAwX3Rva3MgPC0gdG9rZW5zKHBybzIwMDApCnAyMDAwX3Rva3Nfc3cgPC0gdG9rZW5zX3NlbGVjdChwMjAwMF90b2tzLCBwYXR0ZXJuPWZ1bGxfc3RvcHdvcmRzLCBzZWxlY3Rpb249InJlbW92ZSIpCgpwMjAwMF9jb2xsIDwtIHRleHRzdGF0X2NvbGxvY2F0aW9ucyhwMjAwMF90b2tzX3N3LCBtaW5fY291bnQ9MykKYXJyYW5nZShwMjAwMF9jb2xsLCBkZXNjKGNvdW50KSkKYGBgCmBgYHtyfQpzdW1tYXJ5KGZ1bGxfY29ycHVzLCBuPTUpCmBgYAoKIyMgQ29tcGFyaXNvbiBQbG90cwpgYGB7cn0KI2NyZWF0ZSBpbnB1dApjb3JwIDwtIGRmbShmdWxsX2NvcnB1cykKCiMgbGVtbWF0aXNpZXJ1bmcgdmVyc3VjaGVuOgoKCgpkZV9rbGltYSA8LSBkZm1fc2VsZWN0KGNvcnAsIHBhdHRlcm4gPSJrbGltYSoiKQpkZV9yZWxmcmVxIDwtIGRmbV93ZWlnaHQoZGVfa2xpbWEsIHNjaGVtZT0icHJvcCIpCmRlX2ZyZXFzIDwtIHRleHRzdGF0X2ZyZXF1ZW5jeShkZV9yZWxmcmVxLCBncm91cHM9Z3JvdXApCgojcGxvdHRpbmcgCmZyZXFzLmFjdCA8LSBmaWx0ZXIoZGVfZnJlcXMsIGdyb3VwID09ICJhY3RpdmlzdHMiKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSBzZWxlY3QoZmVhdHVyZSwgZnJlcXVlbmN5KQpmcmVxcy5zY2VwdCA8LSBmaWx0ZXIoZGVfZnJlcXMsIGdyb3VwID09ICJzY2VwdGljcyIpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNlbGVjdChmZWF0dXJlLCBmcmVxdWVuY3kpCmZyZXFzIDwtIGxlZnRfam9pbihmcmVxcy5hY3QsIGZyZXFzLnNjZXB0LCBieSA9ICJmZWF0dXJlIikgJT4lIGhlYWQoMzApICU+JSBhcnJhbmdlKGZyZXF1ZW5jeS54KSAlPiUgbXV0YXRlKGZlYXR1cmUgPSBmYWN0b3IoZmVhdHVyZSwgZmVhdHVyZSkpCmdncGxvdChmcmVxcykgKwogIGdlb21fc2VnbWVudChhZXMoeD1mZWF0dXJlLCB4ZW5kPWZlYXR1cmUsIHk9ZnJlcXVlbmN5LngsIHllbmQ9ZnJlcXVlbmN5LnkpLCBjb2xvcj0iZ3JleSIpICsKICBnZW9tX3BvaW50KGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5LngpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMyApICsKICBnZW9tX3BvaW50KGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5LnkpLCBjb2xvciA9ICJsaWdodGJsdWUiLCBzaXplID0gMyApICsKICBnZ3RpdGxlKCJXb3JkIEZyZXF1ZW5jaWVzIikgKyAKICB4bGFiKCIiKSArIHlsYWIoIldvcnRmcmVxdWVueiIpICsgCiAgY29vcmRfZmxpcCgpCgpmcmVxcy5hY3QgCmZyZXFzLnNjZXB0CmBgYApgYGB7cn0KIyB0byBnZXQgbGVtbWF0aXplZCBkZm0gCnNwX3BybzIwMDBfZGZtIDwtIGFzLnRva2VucyhzcF9wcm8yMDAwKSAlPiUKICBkZm0oKQoKc3BfY29uMjAwMF9kZm0gPC0gYXMudG9rZW5zKHNwX2NvbnRyYTIwMDApICU+JQogIGRmbSgpCmBgYAoKYGBge3J9CmRlX2tsaW1hX3BybyA8LSBkZm1fc2VsZWN0KHNwX3BybzIwMDBfZGZtLCBwYXR0ZXJuID0ia2xpbWEqIikKZGVfcmVsZnJlcV9wcm8gPC0gZGZtX3dlaWdodChkZV9rbGltYV9wcm8sIHNjaGVtZT0icHJvcCIpCmRlX2ZyZXFzX3BybyA8LSB0ZXh0c3RhdF9mcmVxdWVuY3koZGVfcmVsZnJlcV9wcm8pCgpkZV9rbGltYV9jb24gPC0gZGZtX3NlbGVjdChzcF9jb24yMDAwX2RmbSwgcGF0dGVybiA9ImtsaW1hKiIpCmRlX3JlbGZyZXFfY29uIDwtIGRmbV93ZWlnaHQoZGVfa2xpbWFfY29uLCBzY2hlbWU9InByb3AiKQpkZV9mcmVxc19jb24gPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGRlX3JlbGZyZXFfY29uKQoKCiNwbG90dGluZyAKZnJlcXMuYWN0IDwtIGZpbHRlcihkZV9mcmVxc19wcm8pICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNlbGVjdChmZWF0dXJlLCBmcmVxdWVuY3kpCmZyZXFzLnNjZXB0IDwtIGZpbHRlcihkZV9mcmVxc19jb24pICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNlbGVjdChmZWF0dXJlLCBmcmVxdWVuY3kpCmZyZXFzIDwtIGxlZnRfam9pbihmcmVxcy5hY3QsIGZyZXFzLnNjZXB0LCBieSA9ICJmZWF0dXJlIikgJT4lIGhlYWQoMzApICU+JSBhcnJhbmdlKGZyZXF1ZW5jeS54KSAlPiUgbXV0YXRlKGZlYXR1cmUgPSBmYWN0b3IoZmVhdHVyZSwgZmVhdHVyZSkpCnAgPC0gZ2dwbG90KGZyZXFzKSArCiAgICBnZW9tX3NlZ21lbnQoYWVzKHg9ZmVhdHVyZSwgeGVuZD1mZWF0dXJlLCB5PWZyZXF1ZW5jeS54LCB5ZW5kPWZyZXF1ZW5jeS55KSwgY29sb3I9ImdyZXkiKSArCiAgICBnZW9tX3BvaW50KGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5LngsIGNvbG91cj0iQWN0aXZpc3RzIiksIHNpemUgPSAzKSArCiAgICBnZW9tX3BvaW50KGFlcyh4PWZlYXR1cmUsIHk9ZnJlcXVlbmN5LnksIGNvbG91cj0iU2NlcHRpY3MiKSwgc2l6ZSA9IDMgKSArCiAgICBnZ3RpdGxlKCJXb3JkIEZyZXF1ZW5jaWVzIikgKyAKICAgIHhsYWIoIiIpICsgeWxhYigiRnJlcXVlbmN5IikgKwogICAgY29vcmRfZmxpcCgpCgpwK2xhYnMoY29sb3VyPSJHcm91cCIpCgpgYGAKYGBge3J9CmRmbV93ZWlnaHRfY29ycCA8LSBmdWxsX2NvcnB1cyAlPiUKICB0b2tlbnMocmVtb3ZlX3B1bmN0ID0gVFJVRSkgJT4lCiAgdG9rZW5zX3JlbW92ZShkZV9zdG9wd29yZHMxKSAlPiUKICBkZm0oKSAlPiUKICBkZm1fd2VpZ2h0KHNjaGVtZSA9ICJwcm9wIikKCiMgQ2FsY3VsYXRlIHJlbGF0aXZlIGZyZXF1ZW5jeSBieSBwcmVzaWRlbnQKZnJlcV93ZWlnaHQgPC0gdGV4dHN0YXRfZnJlcXVlbmN5KGRmbV93ZWlnaHRfY29ycCwgbiA9IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IGRmbV93ZWlnaHRfY29ycCRvcmlnaW4pCgpnZ3Bsb3QoZGF0YSA9IGZyZXFfd2VpZ2h0LCBhZXMoeCA9IG5yb3coZnJlcV93ZWlnaHQpOjEsIHkgPSBmcmVxdWVuY3kpKSArCiAgICAgZ2VvbV9wb2ludCgpICsKICAgICBmYWNldF93cmFwKH4gZ3JvdXAsIHNjYWxlcyA9ICJmcmVlIikgKwogICAgIGNvb3JkX2ZsaXAoKSArCiAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG5yb3coZnJlcV93ZWlnaHQpOjEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGZyZXFfd2VpZ2h0JGZlYXR1cmUpICsKICAgICBsYWJzKHggPSBOVUxMLCB5ID0gIlJlbGF0aXZlIGZyZXF1ZW5jeSIpCmBgYApgYGB7cn0Kc3VtbWFyeShmdWxsX2NvcnB1cywgbj0xMCkKYGBgCgojIyBLZXluZXNzCmBgYHtyfQojIENyZWF0ZSBhIGRmbSBncm91cGVkIGJ5IHByZXNpZGVudApjb3JwX2RmbSA8LSB0b2tlbnMoZnVsbF9jb3JwdXMsIHJlbW92ZV9wdW5jdCA9IFRSVUUpICU+JQogIHRva2Vuc19yZW1vdmUoZGVfc3RvcHdvcmRzMSkgJT4lCiAgdG9rZW5zX2dyb3VwKGdyb3VwcyA9IGdyb3VwKSAlPiUKICBkZm0oKQoKI2NvcnBfZGZtX2tsaW1hIDwtIGRmbV9zZWxlY3QoY29ycF9kZm0sIHBhdHRlcm4gPSJrbGltYSoiKQoKCiMgQ2FsY3VsYXRlIGtleW5lc3MgYW5kIGRldGVybWluZSBUcnVtcCBhcyB0YXJnZXQgZ3JvdXAKcmVzdWx0X2tleW5lc3MgPC0gdGV4dHN0YXRfa2V5bmVzcyhjb3JwX2RmbSwgdGFyZ2V0ID0gImFjdGl2aXN0cyIpCgojIFBsb3QgZXN0aW1hdGVkIHdvcmQga2V5bmVzcwp0ZXh0cGxvdF9rZXluZXNzKHJlc3VsdF9rZXluZXNzLCBtYXJnaW49MC4yLCBuPTEwKSAKYGBgCmBgYHtyfQpjb3JwX2RmbV9rbGltYSA8LSBkZm1fc2VsZWN0KGNvcnBfZGZtLCBwYXR0ZXJuID0ia2xpbWEqIikKCiMgQ2FsY3VsYXRlIGtleW5lc3MgYW5kIGRldGVybWluZSBUcnVtcCBhcyB0YXJnZXQgZ3JvdXAKcmVzdWx0X2tleW5lc3MgPC0gdGV4dHN0YXRfa2V5bmVzcyhjb3JwX2RmbV9rbGltYSwgdGFyZ2V0ID0gImFjdGl2aXN0cyIpCgojIFBsb3QgZXN0aW1hdGVkIHdvcmQga2V5bmVzcwp0ZXh0cGxvdF9rZXluZXNzKHJlc3VsdF9rZXluZXNzLCBtYXJnaW49MC4yLCBuPTE1KSAKYGBgCgoKIyMgQ29tcGFyaXNvbiBDbG91ZApgYGB7cn0KZnVsbF9jb3JwdXMgJT4lCiAgICB0b2tlbnMocmVtb3ZlX3B1bmN0ID0gVFJVRSwgcmVtb3ZlX251bWJlcnM9VFJVRSkgJT4lCiAgICB0b2tlbnNfcmVtb3ZlKGRlX3N0b3B3b3JkczEpICU+JQogICAgZGZtKCkgJT4lCiAgICBkZm1fZ3JvdXAoZ3JvdXBzID0gZ3JvdXApICU+JQogICAgZGZtX3RyaW0obWluX3Rlcm1mcmVxID0gNSwgdmVyYm9zZSA9IEZBTFNFKSAlPiUKICAgIHRleHRwbG90X3dvcmRjbG91ZChjb21wYXJpc29uID0gVFJVRSwgbWF4X3dvcmRzPTEwMCkKICAgICAgICAgICAgICAgICAgICAgICAjLGNvbG9yPWMoImxpZ2h0Ymx1ZSIsImJsdWUiKSkKYGBgCmBgYHtyfQp0ZXh0cGxvdF94cmF5KAogICAga3dpYyh0b2tlbnMocHJvMjAwMCksIHBhdHRlcm4gPSAia2xpbWEqIiksCiAgICBrd2ljKHRva2Vucyhjb250cmEyMDAwKSwgcGF0dGVybiA9ICJrbGltYSoiKSkKYGBgCiMgVG9waWMgTW9kZWxpbmcKYGBge3J9CmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkodG9waWNtb2RlbHMpCmBgYAoKYGBge3J9CmRmbV9mdWxsIDwtIGRmbShmdWxsX2NvcnB1cywgcmVtb3ZlPWRlX3N0b3B3b3JkczEsIHJlbW92ZV9wdW5jdD1UUlVFLCByZW1vdmVfbnVtYmVycz1UUlVFKQpkZm1fZnVsbAoKdG1fZnVsbDwtY29udmVydChkZm1fZnVsbCwgdG89InRvcGljbW9kZWxzIikKCnRvcGljTW9kZWwgPC0gTERBKHRtX2Z1bGwsIGs9NSwgbWV0aG9kPSJHaWJicyIsIGNvbnRyb2w9bGlzdChpdGVyID0gNTAwLCB2ZXJib3NlID0gMjUpKQp0ZXJtcyh0b3BpY01vZGVsLCAxMCkKYGBgCgoKYGBge3J9CmFwX2xkYSA8LSBMREEodG1fZnVsbCwgaz01LCBjb250cm9sPWxpc3Qoc2VlZD0xMjM0KSkKCmFwX3RvcGljcyA8LSB0aWR5KGFwX2xkYSwgbWF0cml4PSJiZXRhIikKCmFwX2xkYQoKCmFwX3RvcF90ZXJtcyA8LSBhcF90b3BpY3MgJT4lCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIHNsaWNlX21heChiZXRhLCBuID0gMTApICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZSh0b3BpYywgLWJldGEpCgphcF90b3BfdGVybXMgJT4lCiAgbXV0YXRlKHRlcm0gPSByZW9yZGVyX3dpdGhpbih0ZXJtLCBiZXRhLCB0b3BpYykpICU+JQogIGdncGxvdChhZXMoYmV0YSwgdGVybSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofiB0b3BpYywgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfeV9yZW9yZGVyZWQoKQoKYGBgCi0gdHJ5IGxlbW1hdGl6ZWQgdmVyc2lvbiBmb3IgdG9waWMgbW9kZWxpbmcgCgoKSWRlYXM6CkRPTkU6IFdvcmRjbG91ZCBQbG90IG9mIENvbXBhcmlzb24gR3JvdXA6CiAgICAgIGh0dHBzOi8vcXVhbnRlZGEuaW8vYXJ0aWNsZXMvcGtnZG93bi9leGFtcGxlcy9wbG90dGluZy5odG1sCgpMZXhpY2FsIERpc3BlcnNpb24gUGxvdCAoWC1SYXkpCi0+IGNvdWxkIGJlIGRvbmUgZm9yIGtleXdvcmRzICJrbGltYSoiCgpOZXh0OgotIENhbGN1bGF0ZSAiQ29ycHVzIFNpbWlsYXJpdHkiCi0gRE9ORTogS2xpbWF3w7ZydGVyIExpc3RlIG1pdCBHcm91cCB1bmQgQ291bnRzIGFic3BlaWNoZXJuIC0+IHdlbGNoZSBLbGltYXfDtnJ0ZXIgZ2lidCBlcyB3byB1bmQgd2llIG9mdAotIEFuYWx5c2UgZGVyIEVyZ2Vibmlzc2UKLSBMaXRlcmF0dXItUmVjaGVyY2hlIHp1IGRlbiBUZXh0bWluaW5nIFRoZW1lbgoKVG9waWMgTW9kZWxpbmcKaHR0cHM6Ly93d3cudGlkeXRleHRtaW5pbmcuY29tL3RvcGljbW9kZWxpbmcuaHRtbAoKCgoKCg==